/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


package controller;

import dao.AirLineDAOException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import dao.UsuarioDAO;
import dao.ReservaDAO;
import dao.VooDAO;
import dao.imp.ReservaDAOImpl;
import dao.imp.UsuarioDAOImpl;
import dao.imp.VooDAOImpl;
import model.Reserva;
import model.Usuario;
import model.Voo;
import java.util.List;
import javax.servlet.RequestDispatcher;

/**
 *
 * @author Neto
 */
public class Controlador extends HttpServlet {
   
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, AirLineDAOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String cmd= request.getParameter("cmd");
        if(cmd == null)
            cmd= "principal";

        //Objetos criados para serem utilizados na conexão com o banco de dados
        UsuarioDAO usuarioDao;
        ReservaDAO reservaDao;
        VooDAO vooDao;

        //Objetos criados para serem utilizados na camada model, utilizados na sessao do cliente ou na utilização do controlador
        Usuario usuario= new Usuario();
        Reserva reserva= new Reserva();
        Voo voo= new Voo();

        /*Aqui estão os comandos de set para os dados que vem dos formulários da View, os values dos formularios tem que ser iguais
         * as do request que estão definidos aqui... do mesmo modo que o action do formulário se for encaminhado para o controlador
         *
         */
        if(cmd.equalsIgnoreCase("atualizarUser") || cmd.equalsIgnoreCase("excluirUser") || cmd.equalsIgnoreCase("salvarUser") ||
                cmd.equalsIgnoreCase("procurarUser") || cmd.equalsIgnoreCase("autenticarUser") || cmd.equalsIgnoreCase("logout")){
            usuario.setId(request.getParameter("id"));
            usuario.setNome(request.getParameter("nome"));
            usuario.setTelefone(request.getParameter("telefone"));
            usuario.setCpf(request.getParameter("cpf"));
            usuario.setEmail(request.getParameter("email"));
            usuario.setLogin(request.getParameter("login"));
            usuario.setSenha(request.getParameter("senha"));
            
        }else if(cmd.equalsIgnoreCase("buscarReserva") || cmd.equalsIgnoreCase("salvarReserva") || cmd.equalsIgnoreCase("excluirReserva") ||
                cmd.equalsIgnoreCase("todasReservas") || cmd.equalsIgnoreCase("atualizarReserva") || cmd.equalsIgnoreCase("dadosReserva") ||
                cmd.equalsIgnoreCase("reservaUser")){

            reserva.setIdUser(request.getParameter("idUser"));
            reserva.setNumVooReserva(request.getParameter("numVooReserva"));
            /*NESTE CASO FAZ-SE OS set DE TODOS OS ATRIBUTOS DE TODOS OS MODELOS
             * PORQUE NA OPERAÇÃO DE LISTAR OS DADOS DA RESERVA USA-SE OS OBJETOS COMO PARAMETROS
             * PARA CRIAR A LISTA COM OS DADOS
             */

            /*usuario.setId(request.getParameter("id"));
            usuario.setNome(request.getParameter("nome"));
            usuario.setTelefone(request.getParameter("telefone"));
            usuario.setCpf(request.getParameter("cpf"));
            usuario.setEmail(request.getParameter("email"));
            usuario.setLogin(request.getParameter("login"));
            usuario.setSenha(request.getParameter("senha"));*/
            voo.setNumVoo(request.getParameter("numVoo"));
            voo.setLocalOrigem(request.getParameter("localOrigem"));
            voo.setLocalDestino(request.getParameter("localDestino"));
            voo.setData(request.getParameter("data"));
            voo.setHora(request.getParameter("hora"));
            voo.setCapacidade(request.getParameter("capacidade"));



        }else if(cmd.equalsIgnoreCase("salvarVoo") || cmd.equalsIgnoreCase("excluirVoo") || cmd.equalsIgnoreCase("atualizarVoo") ||
                cmd.equalsIgnoreCase("buscarVoo") || cmd.equalsIgnoreCase("todosVoos") || cmd.equalsIgnoreCase("buscarVooLocalOrigem") ||
                    (cmd.equalsIgnoreCase("fazerReserva"))){
            voo.setNumVoo(request.getParameter("numVoo"));
            voo.setLocalOrigem(request.getParameter("localOrigem"));
            voo.setLocalDestino(request.getParameter("localDestino"));
            voo.setData(request.getParameter("data"));
            voo.setHora(request.getParameter("hora"));
            voo.setCapacidade(request.getParameter("capacidade"));
        }




        try {
            //criação dos objetos da classe daoImplement
            usuarioDao = new UsuarioDAOImpl();
            reservaDao = new ReservaDAOImpl();
            vooDao = new VooDAOImpl();

            RequestDispatcher rd= null;


            //*********************OPERAÇÕES NA TABELA USUARIO*************************//

                //OPERAÇÃO SALVAR USUARIO
            if(cmd.equalsIgnoreCase("salvarUser")){
                HttpSession sessao= request.getSession(true);
                sessao.removeAttribute("usuario");                                      //REMOVE O ATRIBUTO DA SESSAO SE HOUVER ALGUM
                usuarioDao.salvarUser(usuario);                                         // SALVA O USUÁRIO NO BANCO DE DADOS
                sessao.setAttribute("usuario", usuario);                                //SET O ATRIBUTO DEPOIS DA SESSAO
                rd= request.getRequestDispatcher("mostraCliente.jsp");          //FAZER A VIEW MOSTRAR CLIENTE (A PAGINA SERÁ DIRECIONADA)

                //OPERAÇÃO EXCLUIR USUARIO
            }else if(cmd.equalsIgnoreCase("excluirUser")){
                usuarioDao.excluirUser(usuario);                                        //EXCLUI O USUÁRIO NA CAMADA DAO
                rd= request.getRequestDispatcher("index.jsp");                          //REDIRECIONA PARA A PÁGINA INDEX
                HttpSession sessao= request.getSession(true);
                sessao.removeAttribute("usuario");                                       //REMOVE O ATRIBUTO DA SESSAO

                //OPERAÇÃO ATUALIZAR USUARIO
                /* A OPERAÇÃO ABAIXO TEM DOIS PASSOS, A PRIMEIRA QUE É O atuUsuario CONSISTE EM BUSCAR O USUARIO NO BD,
                 * SETAR O OBJETO usuario NA SESSÃO, E REENCAMINHA A PÁGINA PARA UMA VIEW (FORMULARIO) QUE MOSTRA TODOS
                 * OS DADOS DO USUARIO NOS CAMPOS, O USUARIO MODIFICA O FORMULÁRIO E A ACTION VEM PARA atualizarUsuario QUE
                 * SALVA TODOS OS DADOS NO BD PASSANDO COMO PARAMETRO TODO O OBJETO E DEPOIS REENCAMINHA PARA UMA PÁGINA QUE
                 * LISTA TODOS OS USUARIOS
                 */
            }else if(cmd.equalsIgnoreCase("atualizarUser")){
                HttpSession sessao = request.getSession(true);
                sessao.setAttribute("usuario", usuario);
                usuario= usuarioDao.atualizarUser(usuario);
                rd= request.getRequestDispatcher("controlador?cmd=autenticarUser"); //AUTENTICA O USUÁRIO PARA ATUALIZÁ-LO
            }else if(cmd.equalsIgnoreCase("atuUser")){
                usuario= usuarioDao.procurarUser(usuario.getCpf());                   //PROCURA USUARIO NO BD E SALVA NUM OBJETO
                HttpSession sessao = request.getSession(true);
                sessao.setAttribute("usuario", usuario);                                //SETA O USUÁRIO E A SESSAO
                rd = request.getRequestDispatcher("atualizarUsuario.jsp");                         //FAZER VIEW PARA ATUALIZAR USUARIO!!!!!!


                //OPERAÇÃO AUTENTICAR USUARIO
            }else if(cmd.equalsIgnoreCase("autenticarUser")){                           //TEM ALGUM ERRO AQUI MAIS A IDÉIA ESTÁ CERTA
                try{
                    HttpSession sessao= request.getSession(true);
                    //HttpSession sessaoAdmin= request.getSession(true);
                    //sessao.removeAttribute("usuario");
                    usuario = usuarioDao.procurarUser(usuario.getLogin(), usuario.getSenha());
                    
                    sessao.setAttribute("usuario", usuario);
                    if(usuario.getCpf() != null && !usuario.getCpf().trim().equals("") && usuario.getLogin().equals("admin") &&
                            usuario.getSenha().equals("admin")){
                            //sessaoAdmin.removeAttribute("admin");
                        sessao.setAttribute("admin", usuario);
                        rd= request.getRequestDispatcher("mostraCliente.jsp");
                    }else if(usuario.getCpf() != null && !usuario.getCpf().trim().equals("")){
                        rd= request.getRequestDispatcher("mostraCliente.jsp");                         
                    }else{
                        request.setAttribute("msg", "Erro na autenticação, usuário ou senha incorretos");   //MENSAGEM DE ERRO NA AUTENTICAÇÃO
                        rd= request.getRequestDispatcher("login.jsp");          //REDIRECIONA PARA O LOGIN
                    }
                }catch(Exception e){
                    request.setAttribute("msg", "Erro na autenticação, usuário ou senha incorretos");       //MENSAGEM DE ERRO NA AUTENTICAÇÃO
                    rd= request.getRequestDispatcher("login.jsp");              //REDIRECIONA PARA O LOGIN
                }

                //OPERAÇÃO DE LOGOUT
            }else if(cmd.equalsIgnoreCase("logout")){
                HttpSession sessao = request.getSession(true);
                sessao.removeAttribute("usuario");                                      //REMOVE O USUARIO DA SESSAO
                rd = request.getRequestDispatcher("index.jsp");                 //REDIRECIONA PARA A PÁGINA PRINCIPAL
            }

            //*********************OPERAÇÕES NA TABELA RESERVA*************************//

                //OPERAÇÃO SALVAR RESERVA
            if(cmd.equalsIgnoreCase("salvarReserva")){
                reservaDao.salvarReserva(reserva);                                      //PASSA TODO O OBJETO DO TIPO RESERVA PRA SALVAR NO BD
                rd = request.getRequestDispatcher("controlador?cmd=reservaUser");

                //OPERAÇÃO EXCLUIR RESERVA
            }else if(cmd.equalsIgnoreCase("excluirReserva")){
                reservaDao.excluirReserva(reserva);                                      //PASSA TODO O OBJETO DO TIPO RESERVA PARA EXCLUIR NO BD
                rd = request.getRequestDispatcher("controlador?cmd=todasReservas");

                //OPERAÇÃO BUSCAR RESERVA
            }else if(cmd.equalsIgnoreCase("buscarReserva")){
                reservaDao.buscarReserva(reserva);                                      //BUSCA NO BD UM OBJETO DO TIPO RESERVA
                rd= request.getRequestDispatcher("Controlador?cmd=reservaUser");        //FAZER UMA VIEW PARA MOSTRA RESERVA (SÓ UMA), TEM QUE FAZER OUTRO MÉTODO NO DAOIMPL

                //OPERAÇÃO MOSTRAR TODAS AS RESERVAS
            }else if(cmd.equalsIgnoreCase("todasReservas")){
                List todasReservas= reservaDao.todasReservas();                         //COLOCA NO OBJETO DO TIPO LISTA TODAS AS RESERVAS
                request.setAttribute("todasReservas", todasReservas);  
                rd= request.getRequestDispatcher("todasReservas.jsp");                                  //FAZER UMA VIEW PARA MOSTRA RESERVAS

                //OPERAÇÃO LISTA AS RESERVAS DO USUARIO
            }else if(cmd.equalsIgnoreCase("reservaUser")){
                HttpSession sessao = request.getSession(true);
                usuario = (Usuario) sessao.getAttribute("usuario");

                List reservaUser= reservaDao.reservaUser(usuario);                      //COLOCA NO OBJETO DO TIPO LISTA TODAS AS RESERVAS DO USUARIO
                request.setAttribute("reservaUser", reservaUser);
                rd= request.getRequestDispatcher("reservalogado.jsp");
                
                //OPERAÇÃO QUE LISTA OS DADOS DA RESERVA
            }else if(cmd.equalsIgnoreCase("dadosReserva")){
                List dadosReserva= reservaDao.dadosReserva(reserva, voo, usuario);
                request.setAttribute("dadosReserva", dadosReserva);
                rd= request.getRequestDispatcher("dadosReserva.jsp");                                  //FAZER UMA VIEW PARA MOSTRA OS DADOS DA RESERVA
                
                //OPERAÇÃO ATUALIZAR RESERVA
                /* A OPERAÇÃO ABAIXO TEM DOIS PASSOS, A PRIMEIRA QUE É O atuReserva CONSISTE EM BUSCAR A RESERVA NO BD,
                 * SETAR O OBJETO usuario NA SESSÃO, E REENCAMINHA A PÁGINA PARA UMA VIEW (FORMULARIO) QUE MOSTRA TODOS
                 * OS DADOS DA RESERVA NOS CAMPOS, O USUARIO MODIFICA O FORMULÁRIO E A ACTION VEM PARA atualizarReserva QUE
                 * SALVA TODOS OS DADOS NO BD PASSANDO COMO PARAMETRO TODO O OBJETO E DEPOIS REENCAMINHA PARA UMA PÁGINA QUE
                 * LISTA TODOS AS RESERVAS
                 */
            }else if(cmd.equalsIgnoreCase("atualizarReserva")){
                reservaDao.atualizarReserva(reserva);
                rd= request.getRequestDispatcher("reservaUser");
            }else if(cmd.equalsIgnoreCase("atuReserva")){
                reserva= reservaDao.buscarReserva(reserva);
                HttpSession sessao= request.getSession(false);
                sessao.setAttribute("usuario", usuario);
                rd= request.getRequestDispatcher(" ");                                  //FAZER UMA VIEW PARA ATUALIZAR VOO.JSP

            }

            //*********************OPERAÇÕES NA TABELA VOO*************************//

                //OPERAÇÃO SALVAR VOO
            if(cmd.equalsIgnoreCase("salvarVoo")){
                vooDao.salvarVoo(voo);                                                  //PASSA TODO O OBJETO VOO PARA O BD
                rd= request.getRequestDispatcher("controlador?cmd=todosVoos");          //LISTA TODOS OS VOOS

                //OPERAÇÃO EXCLUIR VOO
            }else if(cmd.equalsIgnoreCase("excluirVoo")){
                vooDao.excluirVoo(voo);                                                 //EXCLUI TODO O OBJETO VOO DO BD
                rd= request.getRequestDispatcher("controlador?cmd=todosVoos");          //LISTA TODOS OS VOOS

                //OPERAÇÃO ATUALIZAR VOO
                /* A OPERAÇÃO ABAIXO TEM DOIS PASSOS, A PRIMEIRA QUE É O atuVoo CONSISTE EM BUSCAR O VOO NO BD,
                 * SETAR O OBJETO usuario NA SESSÃO, E REENCAMINHA A PÁGINA PARA UMA VIEW (FORMULARIO) QUE MOSTRA TODOS
                 * OS DADOS DO VOO NOS CAMPOS, O USUARIO MODIFICA O FORMULÁRIO E A ACTION VEM PARA atualizarVoo QUE
                 * SALVA TODOS OS DADOS NO BD PASSANDO COMO PARAMETRO TODO O OBJETO E DEPOIS REENCAMINHA PARA UMA PÁGINA QUE
                 * LISTA TODOS OS VOOS
                 */
            }else if(cmd.equalsIgnoreCase("atualizarVoo")){
                vooDao.atualizarVoo(voo);                                               //ATUALIZA O VOO NO BD
                rd= request.getRequestDispatcher("Controlador?cmd=todosVoos");          //REENCAMINHA PARA UMA PÁGINA QUE LISTA TODOS OS VOOS
            }else if(cmd.equalsIgnoreCase("atuVoo")){
                voo= vooDao.buscarVoo(voo.getNumVoo());                                 //BUSCA OS DADOS DO VOO A PARTIR DO PREENCHIDO NO MODEL
                HttpSession sessao= request.getSession(false);
                sessao.setAttribute("usuario", usuario);                                //SETA A SESSAO
                rd= request.getRequestDispatcher(" "); //FAZER VIEW PARA ATUALIZAR VOO.JSP  //REENCAMINHA PARA UM FORMULÁRIO

                //OPERAÇÃO LISTAR TODOS OS VOOS
            }else if(cmd.equalsIgnoreCase("todosVoos")){
                List todosVoos= vooDao.todosVoos();
                request.setAttribute("todosVoos", todosVoos);
                rd= request.getRequestDispatcher("todosVoos.jsp");

                //OPERAÇÃO FAZER RESERVA NA TABELA VOO
            }else if(cmd.equalsIgnoreCase("fazerReserva")){
                List listVoos= vooDao.todosVoos();
                request.setAttribute("listVoos", listVoos);
                rd= request.getRequestDispatcher("realizarReserva.jsp");
            }

            rd.forward(request, response);

        }catch(Exception e){
            throw new ServletException (e);
        }

    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (AirLineDAOException ex) {
            Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (AirLineDAOException ex) {
            Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
